package mercadologico.entities.tables;

import exceptions.PersistenceExceptionMessage;
import fiscal.entities.tables.MoldeProduto;
import generic.interfaces.GenericPersistence;
import generic.interfaces.IDEntity;

import java.util.ArrayList;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;

import mercadologico.dao.PersistenceProduto;

@Entity
public class Produto implements IDEntity<Integer>, GenericPersistence<PersistenceProduto, Integer, Produto>, Comparable<Produto>{

	public static PersistenceProduto persist = new PersistenceProduto();
	
	@Id
	@GeneratedValue
	private Integer id;
	private String variavel;
	private String barra1;
	private String barra2;
	
	private Double fatorMedidaCompra;
	@OneToOne
	private Medida medidaCompra;
	@OneToOne
	private Medida medidaVenda;
	@OneToOne
	private Produto produtoSimilar;
	@OneToOne
	private MoldeProduto moldeProduto;
	@OneToOne
	private Marca marca;
	@ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "similaridade_id")
	private Similaridade similaridade;
	
	private Double qtdeEmbalagem;
	private Boolean statusDescricaoManual;
	private String descricaoCompleta;
	private String descricaoReduzida;
	private Integer diasVencimento;
	private Integer dimensaoProdutoComprimento;
	private Integer dimensaoProdutoLargura;
	private Integer dimensaoProdutoAltura;
	private Integer dimensaoEmbalagemComprimento;
	private Integer dimensaoEmbalagemAltura;
	private Integer dimensaoEmbalagemLargura;

	
	public Integer getId() {
		return this.id;
	}	
	
	public void setId(Integer id) {
		this.id = id;
	}
	public String getVariavel() {
		return variavel;
	}
	public void setVariavel(String variavel) {
		this.variavel = variavel;
	}
	public String getBarra1() {
		return barra1;
	}
	public void setBarra1(String barra1) {
		this.barra1 = barra1;
	}
	public String getBarra2() {
		return barra2;
	}
	public void setBarra2(String barra2) {
		this.barra2 = barra2;
	}
	public Produto getProdutoSimilar() {
		return produtoSimilar;
	}
	public void setProdutoSimilar(Produto produtoSimilar) {
		this.produtoSimilar = produtoSimilar;
		if (produtoSimilar != null)
			setVariavel(produtoSimilar.getVariavel());
	}
	public Double getFatorMedidaCompra() {
		return fatorMedidaCompra;
	}
	public void setFatorMedidaCompra(Double fatorMedidaCompra) {
		this.fatorMedidaCompra = fatorMedidaCompra;
	}
	public Medida getMedidaCompra() {
		return medidaCompra;
	}
	public void setMedidaCompra(Medida medidaCompra) {
		this.medidaCompra = medidaCompra;
	}
	public Medida getMedidaVenda() {
		return medidaVenda;
	}
	public void setMedidaVenda(Medida medidaVenda) {
		this.medidaVenda = medidaVenda;
	}
	public MoldeProduto getMoldeProduto() {
		return moldeProduto;
	}
	public void setMoldeProduto(MoldeProduto moldeProduto) {
		this.moldeProduto = moldeProduto;
	}
	public Marca getMarca() {
		return marca;
	}
	public void setMarca(Marca marca) {
		this.marca = marca;
	}
	public Double getQtdeEmbalagem() {
		return qtdeEmbalagem;
	}
	public void setQtdeEmbalagem(Double qtdeEmbalagem) {
		this.qtdeEmbalagem = qtdeEmbalagem;
	}
	public Boolean getStatusDescricaoManual() {
		return statusDescricaoManual;
	}
	public void setStatusDescricaoManual(Boolean statusDescricaoManual) {
		this.statusDescricaoManual = statusDescricaoManual;
	}
	public String getDescricaoCompleta() {
		return descricaoCompleta;
	}
	public void setDescricaoCompleta(String descricaoCompleta) {
		this.descricaoCompleta = descricaoCompleta;
	}
	public String getDescricaoReduzida() {
		return descricaoReduzida;
	}
	public void setDescricaoReduzida(String descricaoReduzida) {
		this.descricaoReduzida = descricaoReduzida;
	}
	public Integer getDiasVencimento() {
		return diasVencimento;
	}
	public void setDiasVencimento(Integer diasVencimento) {
		this.diasVencimento = diasVencimento;
	}
	public Integer getDimensaoProdutoComprimento() {
		return dimensaoProdutoComprimento;
	}
	public void setDimensaoProdutoComprimento(Integer dimensaoProdutoComprimento) {
		this.dimensaoProdutoComprimento = dimensaoProdutoComprimento;
	}
	public Integer getDimensaoProdutoLargura() {
		return dimensaoProdutoLargura;
	}
	public void setDimensaoProdutoLargura(Integer dimensaoProdutoLargura) {
		this.dimensaoProdutoLargura = dimensaoProdutoLargura;
	}
	public Integer getDimensaoProdutoAltura() {
		return dimensaoProdutoAltura;
	}
	public void setDimensaoProdutoAltura(Integer dimensaoProdutoAltura) {
		this.dimensaoProdutoAltura = dimensaoProdutoAltura;
	}
	public Integer getDimensaoEmbalagemComprimento() {
		return dimensaoEmbalagemComprimento;
	}
	public void setDimensaoEmbalagemComprimento(Integer dimensaoEmbalagemComprimento) {
		this.dimensaoEmbalagemComprimento = dimensaoEmbalagemComprimento;
	}
	public Integer getDimensaoEmbalagemAltura() {
		return dimensaoEmbalagemAltura;
	}
	public void setDimensaoEmbalagemAltura(Integer dimensaoEmbalagemAltura) {
		this.dimensaoEmbalagemAltura = dimensaoEmbalagemAltura;
	}
	public Integer getDimensaoEmbalagemLargura() {
		return dimensaoEmbalagemLargura;
	}
	public void setDimensaoEmbalagemLargura(Integer dimensaoEmbalagemLargura) {
		this.dimensaoEmbalagemLargura = dimensaoEmbalagemLargura;
	}
	public Similaridade getSimilaridade() {
		return this.similaridade;
	}
	public void setSimilaridade(Similaridade similaridade) {
		this.similaridade = similaridade;
	}
	public String getDescricaoCompletaVariacao() {
		return getDescricaoCompleta() +" " +getVariavel();
	}
	public String getDescricaoReduzidaVariacao() {
		return getDescricaoReduzida() +" " +getVariavel();
	}
	
	public int compareTo(Produto arg0) {
		// TODO Auto-generated method stub
		return 0;
	}

	
	public PersistenceProduto DAOInstance() throws PersistenceExceptionMessage {
		if (persist == null) {
			persist = new PersistenceProduto();
		}
		return persist;
	}

	
	public Produto find(Integer id) throws PersistenceExceptionMessage {
		// TODO Auto-generated method stub
		return null;
	}
	
	
	public void persist() throws PersistenceExceptionMessage {
		DAOInstance().persist(this);
	}

	
	public void remove() throws PersistenceExceptionMessage {
		// TODO Auto-generated method stub
		
	}

	
	public Produto merge() throws PersistenceExceptionMessage {
		return DAOInstance().merge(this);
	}

	
	public ArrayList<Produto> findAll() throws PersistenceExceptionMessage {
		// TODO Auto-generated method stub
		return null;
	}
	
}
